// /pages/profile-edit/profile-edit.js

// 获取小程序全局 App 实例，用于访问全局数据和方法。
const app = getApp();
// 从封装的用户服务模块中，按需导入“上传头像”和“更新用户资料”的函数。
import { uploadAvatar, updateProfile } from '../../utils/userService.js';
// 从封装的数据校验工具模块中，按需导入“手机号校验”函数。
import { validatePhone } from '../../utils/validators.js';

Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 用户信息对象，提供一个完整的初始结构以避免页面加载初期的渲染错误。
    userInfo: {
      avatar_url: '/static/images/icons/default-avatar.png', // 默认本地头像
      nickname: '加载中...',
      real_name: '',
      phone: '',
      group_name: ''
    },
    // 用于存储从服务器获取的原始用户信息，以便后续比较数据是否被修改。
    originalUserInfo: {},
    // 标记用户是否选择了新的头像（本地临时路径），这是判断是否需要执行上传操作的依据。
    isAvatarChanged: false,
    // 标记当前页面是处于“查看模式”还是“编辑模式”。
    isEditing: false,
    // 标记页面上的数据是否被用户修改过。
    isModified: false,
    // 标记当前是否正在执行保存操作，用于防止用户重复点击。
    isSaving: false, 
  },

  // 页面级别的变量，用于记录进入此页面的来源（例如：'login' 或 'user'）。
  entryPoint: 'user',

  /**
   * 生命周期函数 -- 页面加载时触发
   */
  onLoad(options) {
    // 根据 URL 参数决定页面的初始模式（编辑或查看）。
    if (options.mode === 'edit') {
      this.setData({ isEditing: true });
    }
    // 记录页面来源，用于保存成功后的智能跳转。
    if (options.from) {
      this.entryPoint = options.from;
    }
    // 从服务器获取并加载当前用户的最新个人资料。
    this.fetchUserProfile();
  },

  /**
   * 事件处理函数 -- 用户点击“修改信息”，切换到编辑模式
   */
  enterEditMode() {
    this.setData({ isEditing: true });
  },

  /**
   * 业务函数 -- 从服务器获取完整的用户信息并更新到页面
   */
  async fetchUserProfile() {
    wx.showLoading({ title: '加载中...' });
    try {
      // 调用全局 request 方法，异步获取用户资料。
      const userInfoFromServer = await app.request({
        url: '/api/app/profile/me'
      });
      
      // 对头像URL进行处理，确保其能被正确显示。
      if (userInfoFromServer.avatar_url && userInfoFromServer.avatar_url.startsWith('/static')) {
        // 如果是相对路径，则拼接上服务器的基地址。
        userInfoFromServer.avatar_url = app.globalData.config.baseUrl + userInfoFromServer.avatar_url;
      } else if (!userInfoFromServer.avatar_url) {
        // 如果后端没有返回头像，则使用本地的默认头像。
        userInfoFromServer.avatar_url = '/static/images/icons/default-avatar.png';
      }
      
      // 更新页面的 userInfo 数据，并深拷贝一份作为原始数据备份。
      this.setData({
        userInfo: userInfoFromServer,
        originalUserInfo: JSON.parse(JSON.stringify(userInfoFromServer))
      });
    } catch (err) {
      // 在控制台打印错误，方便调试。用户侧的提示已由 app.request 统一处理。
      console.error("加载用户信息失败", err);
    } finally {
      // 无论请求成功或失败，都隐藏加载提示。
      wx.hideLoading();
    }
  },

  /**
   * 事件处理函数 -- 用户选择新头像后的回调
   */
  onChooseAvatar(e) {
    this.setData({
      'userInfo.avatar_url': e.detail.avatarUrl, // 将页面头像更新为本地临时文件路径
      isAvatarChanged: true, // 标记头像已被更改
      isModified: true       // 标记页面数据已被修改
    });
  },

  /**
   * 事件处理函数 -- 统一处理所有输入框的内容变化
   */
  onInputChange(e) {
    // 从事件对象的 dataset 中获取当前输入框对应的字段名。
    const field = e.currentTarget.dataset.field;
    this.setData({
      [`userInfo.${field}`]: e.detail.value, // 使用计算属性名动态更新 userInfo 中的对应字段
      isModified: true // 标记页面数据已被修改
    });
  },

  /**
   * 事件处理函数 -- 用户点击“保存”按钮
   */
  async handleSave() {
    // 防御性编程：如果信息未被修改或正在保存中，则中断操作。
    if (!this.data.isModified || this.data.isSaving) {
      if (!this.data.isModified) wx.showToast({ title: '信息未修改', icon: 'none' });
      return;
    }

    // 数据校验：在提交前检查手机号格式是否正确。
    const phone = this.data.userInfo.phone;
    if (phone && !validatePhone(phone)) {
      wx.showToast({ title: '请输入正确的手机号码', icon: 'none' });
      return; // 校验失败，中断保存流程。
    }

    this.setData({ isSaving: true });
    wx.showLoading({ title: '正在保存...' });
  
    try {
      // 创建一个 userInfo 的副本，用于后续的数据处理和提交。
      let profileData = { ...this.data.userInfo };
      
      // 步骤1: 如果用户更换了头像，先将本地临时头像上传到服务器。
      if (this.data.isAvatarChanged) {
        const permanentUrl = await uploadAvatar(profileData.avatar_url);
        // 将返回的永久相对路径更新到待提交的数据中。
        profileData.avatar_url = permanentUrl;
      }

      // 步骤2: 调用用户服务，将处理好的用户资料提交到后端。
      const updatedUser = await updateProfile(profileData);
      
      // 步骤3: 保存成功后，更新全局的用户信息状态。
      app.globalData.userInfo = updatedUser;
      wx.showToast({ title: '保存成功' });

      // 步骤4: 等待1.5秒，然后根据页面来源执行不同的跳转逻辑。
      await new Promise(resolve => setTimeout(resolve, 1500));
      if (this.entryPoint === 'login') {
        // 如果来自登录流程，跳转到“我的”主 Tab 页。
        wx.switchTab({ url: '/pages/user/user' });
      } else {
        // 否则，直接返回上一个页面。
        wx.navigateBack();
      }
    } catch (err) {
      // 在控制台记录错误，方便调试。
      console.error("保存流程出错", err);
    } finally {
      // 无论成功或失败，都隐藏加载提示并重置保存状态。
      wx.hideLoading();
      this.setData({ isSaving: false });
    }
  }
});